#全球热力图

import geopandas as gpd
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.colors import LinearSegmentedColormap

# 解决图标题中文乱码问题
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为 SimHei 显示中文
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像时负号'-'显示为方块的问题

# 示例数据：国家及其对应的某项指标
data = {
    'Country': ['United States', 'China', 'Japan', 'Germany', 'India', 'Brazil', 'Canada', 'Russia',
                'Australia', 'South Africa'],
    'Value': [10, 30, 10, 8, 7, 6, 5, 4, 3, 2]
}

# 创建 DataFrame
df = pd.DataFrame(data)

# 读取世界地图数据
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

# 注意：这里需要确保世界地图数据中的国家名称与DataFrame中的国家名称匹配
# GeoPandas的naturalearth_lowres数据集中的国家名称通常是英文的，并且可能不完全与提供的列表匹配
# 例如，可能需要将'United States'更改为'United States of America'（如果数据集中是这样的话）
# 但为了简化示例，我们假设数据已经匹配

# 将指标数据合并到地图数据中
# 注意：这里使用left_on="name"和right_on="Country"可能不正确，因为name字段可能不包含完整的国家名
# 这里需要确保合并的键是正确的。由于我们不知道naturalearth_lowres中的确切字段名，这里暂时保留这样写
# 但在实际应用中，您可能需要调整这些键
world = world.merge(df, how="left", left_on="name", right_on="Country")

# 自定义颜色映射，从rgb（126, 189,251）到rgb（247,87,130）
custom_cmap = LinearSegmentedColormap.from_list("custom_blue_to_pink",
                                               [(126/255, 189/255, 251/255), (247/255, 87/255, 130/255)])

# 绘制地图
fig, ax = plt.subplots(1, 1, figsize=(15, 10))
world.boundary.plot(ax=ax, linewidth=1)

# 注意：下面的plot函数调用中的参数格式有误
# 正确的格式应该是一个字典传递给legend_kwds，并且cmap和missing_kwds应该作为plot函数的直接参数
world.plot(column='Value', ax=ax, legend=True,
           legend_kwds={'label': "指标值", 'orientation': "horizontal"},
           cmap=custom_cmap, missing_kwds={"color": "lightgrey"})

# 设置标题和标签（注意：标签中的文本应该是有效的字符串，而不是看起来像乱码的内容）
ax.set_title("全球热力地图（自定义颜色映射）", fontsize=15)
ax.set_xlabel("经度", fontsize=12)  # 这里应该设置为有意义的标签，比如"经度"
ax.set_ylabel("纬度", fontsize=12)  # 这里应该设置为有意义的标签，比如"纬度"

# 保存图片
plt.savefig("global_heatmap_custom_cmap.png", dpi=300)

# 显示图表
plt.show()